/*
 * Copyright 2014 by Centralized Management Solutions
 * All rights reserved.
 *
 * Author: Brian Nguyen
 */
define(['common/constant', 
        'services/config',
        'i18n'],
	function(constant, config, i18n) {
		var user = {
			appVersion: 	 ko.observable(config.app.version + constant.DEFAULT_REVISION),
			id: 			 ko.observable(constant.DEFAULT_VALUE),
			displayName: 	 ko.observable(constant.DEFAULT_NONAME),
			firstName: 		 ko.observable(constant.VALUE_NULL),
			lastName: 		 ko.observable(constant.VALUE_NULL),
			email: 	 		 ko.observable(constant.DEFAULT_VALUE),
			userName: 		 ko.observable(constant.DEFAULT_VALUE),
			imageUrl: 		 ko.observable(constant.DEFAULT_VALUE),
			locale: 		 ko.observable(constant.DEFAULT_LANGUAGE),
			roles: 		 	 ko.observable(constant.DEFAULT_ROLE),
			isAuthenticated: ko.observable(constant.DEFAULT_AUTHENTICATED),
			
			/**
			 * call it once on startup to replace default data with loaded
			 * ones
			 */
			initial: function(userObj) {
				if (ko.unwrap(userObj)) {
					_.extend(user, ko.mapping.fromJS(userObj));
					user.isAuthenticated(true);
					user.displayName(_.compact([user.firstName(), user.lastName()]).join(' ') || constant.DEFAULT_NONAME);
					
					//Reset language
    				i18n.init({ lng: user.locale() });
				} 
			},

			setVersion: function(revision) {
				user.appVersion(config.app.version + (revision || constant.DEFAULT_REVISION));
			},
			
			clear: function() {
				user.id(constant.DEFAULT_VALUE);
				user.displayName(constant.DEFAULT_NONAME);
				user.firstName(constant.VALUE_NULL);
				user.lastName(constant.VALUE_NULL);
				user.email(constant.DEFAULT_VALUE);
				user.userName(constant.DEFAULT_VALUE);
				user.imageUrl(constant.DEFAULT_VALUE);
				user.locale(constant.DEFAULT_LANGUAGE);
				user.roles(constant.DEFAULT_ROLE);
				user.isAuthenticated(constant.DEFAULT_AUTHENTICATED);
				
				i18n.init({ lng: constant.DEFAULT_LANGUAGE });
		    	i18n.init({ preload: [constant.DEFAULT_LANGUAGE] });
			}
		};

		return user;
	});